package com.easonji.common.util;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @ClassName: ReflexObjectUtils
 * @Description: Java对象反射工具类
 * @Author: LiuJun
 * @date: 2018/07/09 17:01
 * @Version: 1.0
 * @Copyright: Copyright (c) 2018 - 2019
 */
public class ReflexObjectUtils {

    /**
     * 根据属性给对象设值
     * 
     * @param obj
     *            对象
     * @param key
     *            属性
     * @param value
     *            值
     */
    @SuppressWarnings("rawtypes")
    public static void setValueByKey(Object obj, String key, Object value) {
        // 得到类对象
        Class cla = (Class) obj.getClass();
        try {
            Field f = cla.getDeclaredField(key);
            f.setAccessible(true);
            f.set(obj, value);
        } catch (Exception e) {
            return;
        }
    }

    /**
     * 单个对象的所有键值
     * 
     * @param object
     *            单个对象
     * @return 属性和值
     */
    @SuppressWarnings("rawtypes")
    public static Map<String, Object> getKeyAndValue(Object obj) {
        Map<String, Object> map = new HashMap<>(16);
        // 得到类对象
        Class cla = (Class) obj.getClass();
        // 得到类中的所有属性集合
        Field[] fs = cla.getDeclaredFields();
        for (int i = 0; i < fs.length; i++) {
            Field f = fs[i];
            // 设置些属性是可以访问的
            f.setAccessible(true);
            Object val = new Object();
            try {
                val = f.get(obj);
                // 得到此属性的值
                // 设置键值
                map.put(f.getName(), val);
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        return map;
    }

    /**
     * 单个对象的某个键的值
     * 
     * @param object
     *            对象
     * 
     * @param key
     *            键
     * 
     * @return Object 键在对象中所对应得值 没有查到时返回空字符串
     */
    public static Object getValueByKey(Object obj, String key) {
        Map<String, Object> map = getKeyAndValue(obj);
        return map.get(key);
    }

    /**
     * 多个（列表）对象的所有键值
     * 
     * @param object
     * 
     * @return 属性和值列表
     */
    public static List<Map<String, Object>> getKeysAndValues(List<Object> object) {
        List<Map<String, Object>> list = new ArrayList<>();
        for (Object obj : object) {
            Map<String, Object> map = getKeyAndValue(obj);
            list.add(map);
        }
        return list;
    }

    /**
     * 多个（列表）对象的某个键的值
     * 
     * @param object
     * @param key
     * @return 键在对象中所对应得值的列表
     */
    public static List<Object> getValuesByKey(List<Object> object, String key) {
        List<Object> list = new ArrayList<Object>();
        for (Object obj : object) {
            list.add(getValueByKey(obj, key));
        }
        return list;
    }
}
